
#pragma once
#include "gp_XYZ.h"

class gp_XYZ;
class gp_Ax1;
class gp_Ax2;
class gp_Trsf;
class gp_Vec;
class gp_Dir;

//!  Defines a 3D cartesian point. <br>
class gp_Pnt  {

public:

  

  //! Creates a point with zero coordinates. <br>
      gp_Pnt();
  //! Creates a point from a XYZ object. <br>
      gp_Pnt(const gp_XYZ& Coord);
  
//!  Creates a  point with its 3 cartesian's coordinates : Xp, Yp, Zp. <br>
      gp_Pnt(const double Xp,const double Yp,const double Zp);
  
//!  Changes the coordinate of range Index : <br>
//!  Index = 1 => X is modified <br>
//!  Index = 2 => Y is modified <br>
//!  Index = 3 => Z is modified <br>//! Raised if Index != {1, 2, 3}. <br>
        void SetCoord(const int Index,const double Xi) ;
  //! For this point, assigns  the values Xp, Yp and Zp to its three coordinates. <br>
        void SetCoord(const double Xp,const double Yp,const double Zp) ;
  //! Assigns the given value to the X coordinate of this point. <br>
        void SetX(const double X) ;
  //! Assigns the given value to the Y coordinate of this point. <br>
        void SetY(const double Y) ;
  //! Assigns the given value to the Z coordinate of this point. <br>
        void SetZ(const double Z) ;
  //! Assigns the three coordinates of Coord to this point. <br>
        void SetXYZ(const gp_XYZ& Coord) ;
  
//!  Returns the coordinate of corresponding to the value of  Index : <br>
//!  Index = 1 => X is returned <br>
//!  Index = 2 => Y is returned <br>
//!  Index = 3 => Z is returned <br>
//! Raises OutOfRange if Index != {1, 2, 3}. <br>//! Raised if Index != {1, 2, 3}. <br>
        double Coord(const int Index) const;
  //! For this point gives its three coordinates Xp, Yp and Zp. <br>
        void Coord(double& Xp,double& Yp,double& Zp) const;
  //! For this point, returns its X coordinate. <br>
        double X() const;
  //! For this point, returns its Y coordinate. <br>
        double Y() const;
  //! For this point, returns its Z coordinate. <br>
        double Z() const;
  //! For this point, returns its three coordinates as a XYZ object. <br>
       const gp_XYZ& XYZ() const;
  //! For this point, returns its three coordinates as a XYZ object. <br>
       const gp_XYZ& Coord() const;
  
//! Returns the coordinates of this point. <br>
//! Note: This syntax allows direct modification of the returned value. <br>
        gp_XYZ& ChangeCoord() ;
  //! Assigns the result of the following expression to this point <br>
//! (Alpha*this + Beta*P) / (Alpha + Beta) <br>
        void BaryCenter(const double Alpha,const gp_Pnt& P,const double Beta) ;
  //! Comparison <br>
//!  Returns True if the distance between the two points is <br>
//!  lower or equal to LinearTolerance. <br>
        bool IsEqual(const gp_Pnt& Other,const double LinearTolerance) const;
  //! Computes the distance between two points. <br>
        double Distance(const gp_Pnt& Other) const;
  //! Computes the square distance between two points. <br>
        double SquareDistance(const gp_Pnt& Other) const;
  
//!  Performs the symmetrical transformation of a point <br>
//!  with respect to the point P which is the center of <br>
//!  the  symmetry. <br>
       void Mirror(const gp_Pnt& P) ;
  
//!  Performs the symmetrical transformation of a point <br>
//!  with respect to an axis placement which is the axis <br>
//!  of the symmetry. <br>
       gp_Pnt Mirrored(const gp_Pnt& P) const;
  
       void Mirror(const gp_Ax1& A1) ;
  
//!  Performs the symmetrical transformation of a point <br>
//!  with respect to a plane. The axis placement A2 locates <br>
//!  the plane of the symmetry : (Location, XDirection, YDirection). <br>
       gp_Pnt Mirrored(const gp_Ax1& A1) const;
  
       void Mirror(const gp_Ax2& A2) ;
  
//!  Rotates a point. A1 is the axis of the rotation. <br>
//!  Ang is the angular value of the rotation in radians. <br>
       gp_Pnt Mirrored(const gp_Ax2& A2) const;
  
        void Rotate(const gp_Ax1& A1,const double Ang) ;
  //! Scales a point. S is the scaling value. <br>
        gp_Pnt Rotated(const gp_Ax1& A1,const double Ang) const;
  
        void Scale(const gp_Pnt& P,const double S) ;
  //! Transforms a point with the transformation T. <br>
        gp_Pnt Scaled(const gp_Pnt& P,const double S) const;
  
       void Transform(const gp_Trsf& T) ;
  
//!  Translates a point in the direction of the vector V. <br>
//!  The magnitude of the translation is the vector's magnitude. <br>
        gp_Pnt Transformed(const gp_Trsf& T) const;
  
        void Translate(const gp_Vec& V) ;
  
//!  Translates a point from the point P1 to the point P2. <br>
        gp_Pnt Translated(const gp_Vec& V) const;
  
        void Translate(const gp_Pnt& P1,const gp_Pnt& P2) ;
  
        gp_Pnt Translated(const gp_Pnt& P1,const gp_Pnt& P2) const;
		const gp_XYZ& _CSFDB_Getgp_Pntcoord() const { return coord; };

		gp_Pnt Moved(const gp_Dir& D,double length);	

protected:




private: 


gp_XYZ coord;


};






// other  functions and methods (like "C++: function call" methods)



